﻿#pragma once
#include <cstdint>
#include "yzrutil.h"
#include "RingBuffer.h"
#include "array/Array.hpp"

namespace yzrilyzr_dsp{
	EBCLASS(FFT){
	private:
	int32_t M;
	yzrilyzr_array::SampleArray sinTable;
	yzrilyzr_array::SampleArray cosTable;
	yzrilyzr_array::SampleArray cpRe;
	yzrilyzr_array::SampleArray cpIm;
	u_index fftLength;
	public:
	FFT(u_index fftLength);
	~FFT();
	void computeM();
	void generateSinCosTable();
	void generateComplexArray();
	void deleteComplexArray();
	void fft();
	void ifft();
	//static void multiple(Complex * *a, Complex * *b, Complex * *output, int32_t complexLength);
	void setComplex(u_index index, u_sample real, u_sample imag);
	void input(yzrilyzr_array::SampleArray & buffer);
	void outputMagnitude(yzrilyzr_array::SampleArray & buffer);
	void outputPhase(yzrilyzr_array::SampleArray & buffer);
	void inputRingBuffer(RingBufferSample * buffer, int32_t length);
	inline u_sample phaseAt(u_index index) const;
	inline u_sample magnitudeAt(u_index index) const;
	inline u_sample realAt(u_index index) const;
	inline u_sample imagAt(u_index index) const;
	};
}